Always allow overriding where clients connect through XENSTORED_PATH.
authorcl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk>
Mon, 12 Sep 2005 21:42:26 +0000 (21:42 +0000)
committercl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk>
Mon, 12 Sep 2005 21:42:26 +0000 (21:42 +0000)
Detect if we're connecting to a socket or to the domain device and
open accordingly.
Signed-off-by: Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
tools/xenstore/xs.c
tools/xenstore/xs_lib.c

index 95fc942c4afc4572d4fcb6da20858b72b61a9900..9991cefc61b1c5c8fdaffac4c3c3c1e1907c20df 100644 (file)
@@ -97,19 +97,32 @@ static struct xs_handle *get_dev(const char *connect_to)
        return NULL;
 }
 
+static struct xs_handle *get_handle(const char *connect_to)
+{
+       struct stat buf;
+
+       if (stat(connect_to, &buf) != 0)
+               return NULL;
+
+       if (S_ISSOCK(buf.st_mode))
+               return get_socket(connect_to);
+       else
+               return get_dev(connect_to);
+}
+
 struct xs_handle *xs_daemon_open(void)
 {
-       return get_socket(xs_daemon_socket());
+       return get_handle(xs_daemon_socket());
 }
 
 struct xs_handle *xs_daemon_open_readonly(void)
 {
-       return get_socket(xs_daemon_socket_ro());
+       return get_handle(xs_daemon_socket_ro());
 }
 
 struct xs_handle *xs_domain_open(void)
 {
-       return get_dev(xs_domain_dev());
+       return get_handle(xs_domain_dev());
 }
 
 void xs_daemon_close(struct xs_handle *h)
index 4c355b990230f3c79d2f651891e3503a9da0a7bb..5eb7fada6e419fd1fbbdd6db339a67fcc8f56713 100644 (file)
@@ -38,37 +38,55 @@ static const char *xs_daemon_rundir(void)
        return (s ? s : "/var/run/xenstored");
 }
 
-const char *xs_daemon_socket(void)
+static const char *xs_daemon_path(void)
 {
        static char buf[PATH_MAX];
-       sprintf(buf, "%s/socket", xs_daemon_rundir());
+       char *s = getenv("XENSTORED_PATH");
+       if (s)
+               return s;
+       if (snprintf(buf, PATH_MAX, "%s/socket",
+                    xs_daemon_rundir()) >= PATH_MAX)
+               return NULL;
        return buf;
 }
 
+const char *xs_daemon_socket(void)
+{
+       return xs_daemon_path();
+}
+
 const char *xs_daemon_socket_ro(void)
 {
        static char buf[PATH_MAX];
-       sprintf(buf, "%s/socket_ro", xs_daemon_rundir());
+       const char *s = xs_daemon_path();
+       if (s == NULL)
+               return NULL;
+       if (snprintf(buf, PATH_MAX, "%s_ro", s) >= PATH_MAX)
+               return NULL;
        return buf;
 }
 
 const char *xs_daemon_store(void)
 {
        static char buf[PATH_MAX];
-       sprintf(buf, "%s/store", xs_daemon_rootdir());
+       if (snprintf(buf, PATH_MAX, "%s/store",
+                    xs_daemon_rootdir()) >= PATH_MAX)
+               return NULL;
        return buf;
 }
 
 const char *xs_daemon_transactions(void)
 {
        static char buf[PATH_MAX];
-       sprintf(buf, "%s/transactions", xs_daemon_rootdir());
+       if (snprintf(buf, PATH_MAX, "%s/transactions",
+                    xs_daemon_rootdir()) >= PATH_MAX)
+               return NULL;
        return buf;
 }
 
 const char *xs_domain_dev(void)
 {
-       char *s = getenv("XENSTORED_DOMAIN_DEV");
+       char *s = getenv("XENSTORED_PATH");
        return (s ? s : "/proc/xen/xenbus");
 }